package week_08;

/**
 * 541. 反转字符串 II
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每 2k 个字符反转前 k 个字符。
 * <p>
 * 如果剩余字符少于 k 个，则将剩余字符全部反转。
 * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "abcdefg", k = 2
 * 输出："bacdfeg"
 * 示例 2：
 * <p>
 * 输入：s = "abcd", k = 2
 * 输出："bacd"
 */
public class ReverseStr_II_541 {
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int l = 0;
        int n = chars.length;
        while (n - l > 0) {
            if (n - l < k) {
                reverseStr(chars, l, n - 1);
            } else {
                reverseStr(chars, l, l + k - 1);
            }
            l = l + 2*k;
        }
        return String.valueOf(chars);
    }

    public void reverseStr(char[] s, int l, int r) {
        int n = r - l + 1;
        for (int i = 0; i < n / 2; i++) {
            char tmp = s[i];
            s[i] = s[n - i - 1];
            s[n - i - 1] = tmp;
        }
    }

    public void reverseStr2(char[] s, int l, int r) {
        while (l < r) {
            char tmp = s[l];
            s[l++] = s[r];
            s[r--] = tmp;
        }
    }
}
